package com.smx.sync.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;
import java.util.Map;

/**
 * SyncTask
 *
 * @author 廖功旺
 * @version 1.0
 * @since 2025/6/23 16:44
 */
@Data
@TableName("sync_task")
public class SyncTask implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主键
     */
    private Integer id;
    /**
     * 数据源数据库编号
     */
    private Integer sourceDbId;
    /**
     * 数据源表
     */
    private String sourceTable;
    /**
     * 数据源表主键字段
     */
    private String sourceIdField;
    /**
     * 数据源表时间字段
     */
    private String sourceTimeField;
    /**
     * 数据目标数据库编号
     */
    private Integer targetDbId;
    /**
     * 目标表
     */
    private String targetTable;
    /**
     * 目标表主键字段
     */
    private String targetIdField;
    /**
     * 字段映射
     */
    private String fieldMapping;
    /**
     * 定时任务
     */
    private String cron;
    /**
     * 批次大小
     */
    private Integer batchSize;

    /**
     * 数据源数据库驱动
     */
    @TableField(exist = false)
    private String sourceDbDriver;
    /**
     * 数据源数据库连接
     */
    @TableField(exist = false)
    private String sourceDbUrl;
    /**
     * 数据源数据库用户名
     */
    @TableField(exist = false)
    private String sourceDbUsername;
    /**
     * 数据源数据库密码
     */
    @TableField(exist = false)
    private String sourceDbPassword;
    /**
     * 数据源数据库类型
     */
    @TableField(exist = false)
    private String sourceDbType;
    /**
     * 数据目标数据库驱动
     */
    @TableField(exist = false)
    private String targetDbDriver;
    /**
     * 数据目标数据库连接
     */
    @TableField(exist = false)
    private String targetDbUrl;
    /**
     * 数据目标数据库用户名
     */
    @TableField(exist = false)
    private String targetDbUsername;
    /**
     * 数据目标数据库密码
     */
    @TableField(exist = false)
    private String targetDbPassword;
    /**
     * 数据目标数据库类型
     */
    @TableField(exist = false)
    private String targetDbType;
    /**
     * 最新同步时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @TableField(exist = false)
    private Date lastSyncTime;

    // 转换后的字段映射
    public Map<String, String> getFieldMappingMap() {
        ObjectMapper mapper = new ObjectMapper();
        try {
            return mapper.readValue(fieldMapping, new TypeReference<Map<String, String>>() {
            });
        } catch (JsonProcessingException e) {
            throw new RuntimeException("JSON 反序列化失败: " + fieldMapping, e);
        }
    }
}
